﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using AdministracionPedidos;
using AdministracionPreparacion;
using ComposicionPedidos;

namespace ControladorGUI
{
    public class ControladorPizzeria:ISeleccionador
    {        
        private static ControladorPizzeria instance;
        private IFrmIngresoPedido formIngresoPedido;
        private IFrmPreparacionPedido formPreparacionPedido;
        private IFrmSeleccionadorHorno formSeleccionadorHorno;
        private AdministradorPedidos _administradorPedidos;
        private AdministradorPreparacion _administradorPreparacion;
        
        private ControladorPizzeria()
        {
            _administradorPedidos = new AdministradorPedidos();

            List<ColaPreparacion> listaColaPreparacion = new List<ColaPreparacion>();

            ColaAsignacion _colaAsig = _administradorPedidos.getColaAsignacion();

            foreach (Observador o in _colaAsig.getObservadores())
            {
                ColaPreparacion colaPrep = o.getColaPreparacion();
                listaColaPreparacion.Add(colaPrep);
            }


            _administradorPreparacion = new AdministradorPreparacion(listaColaPreparacion);
            
        }

        public static ControladorPizzeria Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new ControladorPizzeria();
                }
                return instance;
            }
        }


        public void write(string path)
        {
            
            _administradorPedidos.read(path);

        }


        public void ingresar()
        {
           
            Hashtable hash = formIngresoPedido.GetPedido();
            ResultadoCreacionPedido _resCreacionPedido;
            List<ProductoCantidad> listaProductosCant = new List<ProductoCantidad>();
            List<Bebida> listaBebida = new List<Bebida>();

            foreach (KeyValuePair<string,string> clave in hash.Keys)
            {
                ProductoCantidad prodCant;
                ProductoPizzeria producto;
                Bebida bebida;

                switch(clave.Key)
                {
                    case "Pizza":
                        if (clave.Value == "Muzzarela")
                        {
                            prodCant = new ProductoCantidad();
                            prodCant.setCantidadCocinada(0);
                            prodCant.setCantidadTotal(Convert.ToInt16(hash[clave]));
                            producto = new Pizza(SaborPizza.Muzzarela);
                            producto.setTiempoCoccion(10);
                            //List<Insumo> insumos = new List<Insumo>();
                            //insumos.Add(Insumo.KitPizzaMuzzarela);
                            //producto.setInsumos(insumos);
                            prodCant.setProducto(producto);
                            listaProductosCant.Add(prodCant);
                        }
                        else if (clave.Value == "Fugazza")
                        {
                            prodCant = new ProductoCantidad();
                            prodCant.setCantidadCocinada(0);
                            prodCant.setCantidadTotal(Convert.ToInt16(hash[clave]));
                            producto = new Pizza(SaborPizza.Fugazza);
                            producto.setTiempoCoccion(12);
                            /*List<Insumo> insumos = new List<Insumo>();
                            insumos.Add(Insumo.KitPizzaFugaza);
                            producto.setInsumos(insumos);*/
                            prodCant.setProducto(producto);
                            listaProductosCant.Add(prodCant);
                        }
                        break;
                        
                    case "Empanada":
                        if (clave.Value == "Carne")
                        {
                            prodCant = new ProductoCantidad();
                            prodCant.setCantidadCocinada(0);
                            prodCant.setCantidadTotal(Convert.ToInt16(hash[clave]));
                            producto = new Empanada(SaborEmpanada.Carne);
                            producto.setTiempoCoccion(2);
                            /*List<Insumo> insumos = new List<Insumo>();
                            insumos.Add(Insumo.KitEmpandaCarne);
                            producto.setInsumos(insumos);*/
                            prodCant.setProducto(producto);
                            listaProductosCant.Add(prodCant);
                        }
                        else if (clave.Value == "Pollo")
                        {
                            prodCant = new ProductoCantidad();
                            prodCant.setCantidadCocinada(0);
                            prodCant.setCantidadTotal(Convert.ToInt16(hash[clave]));
                            producto = new Empanada(SaborEmpanada.Pollo);
                            producto.setTiempoCoccion(3);
                            /*List<Insumo> insumos = new List<Insumo>();
                            insumos.Add(Insumo.KitEmpandaPollo);
                            producto.setInsumos(insumos);*/
                            prodCant.setProducto(producto);
                            listaProductosCant.Add(prodCant);
                        }
                        else if (clave.Value == "Verdura")
                        {
                            prodCant = new ProductoCantidad();
                            prodCant.setCantidadCocinada(0);
                            prodCant.setCantidadTotal(Convert.ToInt16(hash[clave]));
                            producto = new Empanada(SaborEmpanada.Verdura);
                            producto.setTiempoCoccion(2);
                            /*List<Insumo> insumos = new List<Insumo>();
                            insumos.Add(Insumo.KitEmpanadaVerdura);
                            producto.setInsumos(insumos);*/
                            prodCant.setProducto(producto);
                            listaProductosCant.Add(prodCant);
                        }
                        else if (clave.Value == "JamonQueso")
                        {
                            prodCant = new ProductoCantidad();
                            prodCant.setCantidadCocinada(0);
                            prodCant.setCantidadTotal(Convert.ToInt16(hash[clave]));
                            producto = new Empanada(SaborEmpanada.JamonQueso);
                            producto.setTiempoCoccion(3);
                            /*List<Insumo> insumos = new List<Insumo>();
                            insumos.Add(Insumo.KitEmpandaJamonQueso);
                            producto.setInsumos(insumos);*/
                            prodCant.setProducto(producto);
                            listaProductosCant.Add(prodCant);
                        }
                        break;


                    case "Bebida":
                        if (clave.Value == "Cerveza")
                        {
                            bebida = new Bebida();
                            //bebida.setInsumo(Insumo.Cerveza);
                            listaBebida.Add(bebida);
                        }
                        else if (clave.Value == "Gaseosa"){
                            bebida = new Bebida();
                            //bebida.setInsumo(Insumo.Gaseosa);
                            listaBebida.Add(bebida);
                        }
                        break;
                }
                
                
            }

            int nroCliente = formIngresoPedido.NroCliente;

            _resCreacionPedido = _administradorPedidos.registrarPedido(listaProductosCant, listaBebida, nroCliente, this);

            if (_resCreacionPedido!=null)
            {
                if (_resCreacionPedido.StockCritico != null &&_resCreacionPedido.StockCritico.Count > 0)
                    formIngresoPedido.MostrarStockCritico(_resCreacionPedido.StockCritico);
                
                if (_resCreacionPedido.InsumosInsuficientes != null &&_resCreacionPedido.InsumosInsuficientes.Count > 0)
                    formIngresoPedido.MostrarStockInsumosIns(_resCreacionPedido.InsumosInsuficientes);

                if (_resCreacionPedido.NroPedido != 0)
                    formIngresoPedido.MostrarMsgCreacionPedido(_resCreacionPedido.NroPedido.ToString());
                
            }

            formIngresoPedido.Clear();

        }

        public int dameIdHorno(ColaAsignacion _colaAsignacion)
        {
            
            Queue<KeyValuePair<Pedido, int>> pedidosEnHorno = _colaAsignacion.getPedidosAsignados();
            List<Pedido> colaHornoPizza = new List<Pedido>();;
            List<Pedido> colaHornoEmpanadas = new List<Pedido>();


            foreach (KeyValuePair<Pedido, int> pedidoHorno in pedidosEnHorno)
            {
                if (pedidoHorno.Value == 0)
                {
                    colaHornoPizza.Add(pedidoHorno.Key);
                }
                else
                {
                    colaHornoEmpanadas.Add(pedidoHorno.Key);
                }
            }

            formSeleccionadorHorno.seleccionar(colaHornoPizza,colaHornoEmpanadas);

            return formSeleccionadorHorno.IdHorno;

        }

        public void InicializarIngresoPedidos(IFrmIngresoPedido _form, IFrmSeleccionadorHorno _formSeleccionador)
        {
            formIngresoPedido = _form;
            formSeleccionadorHorno = _formSeleccionador;

        }
        
        public void InicializarPreparacionPedidos(IFrmPreparacionPedido _form)
        {
            formPreparacionPedido = _form;
            int i = 0;
            List<MaestroCocina> listMaestro =  _administradorPreparacion.getMaestrosCocina();
            List<string> maestros = new List<string>();

            while( i  < listMaestro.Count)
            {
                maestros.Add(listMaestro[i].Nombre);
                i++;
            }

            
            formPreparacionPedido.Inicializar(maestros);

        }

        public void prepararPedido(string nombreMaestro)
        {
            int i = 0;
            bool encuentre = false;
            int pedidoPreparado = 0;
            List<MaestroCocina> listMaestro = _administradorPreparacion.getMaestrosCocina();
           
            while( i  < listMaestro.Count && !encuentre)
            {
                if (listMaestro[i].Nombre == nombreMaestro)
                {
                    pedidoPreparado = _administradorPreparacion.preparar(listMaestro[i], _administradorPedidos);
                    encuentre = true;
                }
                i++;
            }

            if (pedidoPreparado == 0)
                formPreparacionPedido.MostrarMsgInexPedido(nombreMaestro);
            else
                formPreparacionPedido.MostrarMsgPedidoPrep(pedidoPreparado.ToString());
        }

    }
}
